<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.10">
<title>Confluent Platform Helm Charts</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
:not(pre)>code.nobreak{word-wrap:normal}
:not(pre)>code.nowrap{white-space:nowrap}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
table.tableblock{max-width:100%;border-collapse:separate}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot,table.frame-ends{border-width:1px 0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="article">
<div id="header">
<h1>Confluent Platform Helm Charts</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>You can use the Helm charts to deploy services on Kubernetes for development, test, and proof of concept environments.</p>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
Open Source Helm charts are not supported by Confluent.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p><strong>If you want to use Confluent Platform on Kubernetes in a test or production environment, follow these instructions to install <a href="https://docs.confluent.io/current/installation/operator/index.html#operator-about-intro">Confluent Operator</a>.</strong></p>
</div>
<div id="toc" class="toc">
<div id="toctitle" class="title">Table of content</div>
<ul class="sectlevel1">
<li><a href="#installation">Installation</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#documentation">Documentation</a>
<ul class="sectlevel2">
<li><a href="#environment-preparation">Environment Preparation</a>
<ul class="sectlevel3">
<li><a href="#tested-software">Tested Software</a></li>
<li><a href="#install-helm-on-kubernetes">Install Helm on Kubernetes</a></li>
</ul>
</li>
<li><a href="#persistence">Persistence</a></li>
<li><a href="#install-confluent-platform-charts">Install Confluent Platform Charts</a></li>
<li><a href="#verify-installation">Verify Installation</a>
<ul class="sectlevel3">
<li><a href="#using-helm">Using Helm</a></li>
<li><a href="#verify-kafka-cluster">Verify Kafka cluster</a></li>
<li><a href="#manual-test">Manual Test</a></li>
<li><a href="#run-a-streams-application">Run A Streams Application</a></li>
</ul>
</li>
<li><a href="#operations">Operations</a>
<ul class="sectlevel3">
<li><a href="#scaling-zookeeper">Scaling Zookeeper</a></li>
<li><a href="#scaling-kafka">Scaling Kafka</a></li>
<li><a href="#monitoring">Monitoring</a></li>
</ul>
</li>
<li><a href="#teardown">Teardown</a></li>
</ul>
</li>
<li><a href="#appendix-create-a-local-kubernetes-cluster">Appendix: Create a Local Kubernetes Cluster</a>
<ul class="sectlevel2">
<li><a href="#create-local-minikube">Install Minikube and Drivers</a></li>
<li><a href="#start-minikube">Start Minikube</a>
<ul class="sectlevel3">
<li><a href="#verify-minikube-local-kubernetes-environment">Verify Minikube Local Kubernetes Environment</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#thanks">Thanks</a></li>
</ul>
</div>
<div class="paragraph">
<p>The <a href="https://github.com/confluentinc/cp-helm-charts">Confluent Platform Helm Charts</a> enable you to deploy Confluent Platform components on Kubernetes for development, test, and proof of concept environments.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="installation"><a class="anchor" href="#installation"></a>Installation</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="title">Installing helm chart</div>
<div class="content">
<pre class="rouge highlight"><code data-lang="bash">helm repo add confluentinc https://confluentinc.github.io/cp-helm-charts/   <i class="conum" data-value="1"></i><b>(1)</b>
helm repo update    <i class="conum" data-value="2"></i><b>(2)</b>
helm <span class="nb">install </span>confluentinc/cp-helm-charts <span class="nt">--name</span> my-confluent <span class="nt">--version</span> 0.5.0    <i class="conum" data-value="3"></i><b>(3)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Add <code>confluentinc</code> helm charts repo</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Update repo information</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Install Confluent Platform with release name «my-confluent» and version <code>0.5.0</code></td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="contributing"><a class="anchor" href="#contributing"></a>Contributing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We welcome any contributions:</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
It&#8217;s not officially supported repo, hence support is on "best effort" basis.
</td>
</tr>
</table>
</div>
<div class="ulist">
<ul>
<li>
<p>Report all enhancements, bugs, and tasks as <a href="https://github.com/confluentinc/cp-helm-charts/issues">GitHub issues</a></p>
</li>
<li>
<p>Provide fixes or enhancements by opening pull requests in GitHub</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="documentation"><a class="anchor" href="#documentation"></a>Documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://helm.sh/">Helm</a> is an open-source packaging tool that helps you install applications and services on Kubernetes.
Helm uses a packaging format called charts.
Charts are a collection of YAML templates that describe a related set of Kubernetes resources.</p>
</div>
<div class="paragraph">
<p>This repository provides Helm charts for the following Confluent
Platform services:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>ZooKeeper</p>
</li>
<li>
<p>Kafka brokers</p>
</li>
<li>
<p>Kafka Connect</p>
</li>
<li>
<p>Confluent Schema Registry</p>
</li>
<li>
<p>Confluent REST Proxy</p>
</li>
<li>
<p>ksqlDB</p>
</li>
<li>
<p>Confluent Control Center</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="environment-preparation"><a class="anchor" href="#environment-preparation"></a>Environment Preparation</h3>
<div class="paragraph">
<p>You must have a Kubernetes cluster that has Helm configured.</p>
</div>
<div class="sect3">
<h4 id="tested-software"><a class="anchor" href="#tested-software"></a>Tested Software</h4>
<div class="paragraph">
<p>These Helm charts have been tested with the following software versions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://kubernetes.io/">Kubernetes</a> 1.9.2+</p>
</li>
<li>
<p><a href="https://helm.sh/">Helm</a> 2.8.2+</p>
</li>
<li>
<p><a href="https://hub.docker.com/u/confluentinc/">Confluent Platform Docker Images</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For local Kubernetes installation with Minikube, see <a href="#create-local-minikube">Install Minikube and Drivers</a>.</p>
</div>
</div>
<div class="sect3">
<h4 id="install-helm-on-kubernetes"><a class="anchor" href="#install-helm-on-kubernetes"></a>Install Helm on Kubernetes</h4>
<div class="paragraph">
<p>Follow the directions to <a href="https://docs.helm.sh/using_helm/#quickstart-guide">install and deploy Helm</a> to the Kubernetes cluster.</p>
</div>
<div class="paragraph">
<p>View a list of all deployed releases in the local installation.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm init
helm repo update
helm list</code></pre>
</div>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
For Helm versions prior to 2.9.1, you may see <code>"connect: connection refused"</code>, and will need to fix up the deployment before proceeding.
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">kubectl delete <span class="nt">--namespace</span> kube-system svc tiller-deploy
kubectl delete <span class="nt">--namespace</span> kube-system deploy tiller-deploy
kubectl create serviceaccount <span class="nt">--namespace</span> kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule <span class="nt">--clusterrole</span><span class="o">=</span>cluster-admin <span class="nt">--serviceaccount</span><span class="o">=</span>kube-system:tiller
kubectl patch deploy <span class="nt">--namespace</span> kube-system tiller-deploy <span class="nt">-p</span> <span class="s1">'{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'</span>
helm init <span class="nt">--service-account</span> tiller <span class="nt">--upgrade</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="persistence"><a class="anchor" href="#persistence"></a>Persistence</h3>
<div class="paragraph">
<p>The ZooKeeper and Kafka cluster deployed with <code>StatefulSets</code> that have a <code>volumeClaimTemplate</code> which provides the persistent volume for each replica.
You can define the size of the volumes by changing <code>dataDirSize</code> and <code>dataLogDirSize</code> under <code>cp-zookeeper</code> and <code>size</code> under <code>cp-kafka</code> in <a href="https://github.com/confluentinc/cp-helm-charts/blob/master/values.yaml">values.yaml</a>.</p>
</div>
<div class="paragraph">
<p>You also could use the cloud provider&#8217;s volumes by specifying <a href="https://kubernetes.io/docs/concepts/storage/storage-classes/">StorageClass</a>.
For example, if you are on AWS your storage class will look like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="yaml"><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">storage.k8s.io/v1beta1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">StorageClass</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">ssd</span>
<span class="na">provisioner</span><span class="pi">:</span> <span class="s">kubernetes.io/aws-ebs</span>
<span class="na">parameters</span><span class="pi">:</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">gp2</span></code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
To adapt this example to your needs, read the Kubernetes <a href="https://kubernetes.io/docs/concepts/storage/storage-classes/#parameters">StorageClass</a> documentation.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The <code>StorageClass</code> that was created can be specified in <code>dataLogDirStorageClass</code> and <code>dataDirStorageClass</code> under <code>cp-zookeeper</code> and in <code>storageClass+</code> under <code>cp-kafka</code> in <a href="https://github.com/confluentinc/cp-helm-charts/blob/master/values.yaml">values.yaml</a>.</p>
</div>
<div class="paragraph">
<p>To deploy non-persistent Kafka and ZooKeeper clusters, you must change  the value of <code>persistence.enabled</code> under <code>cp-kafka</code> and <code>cp-zookeeper</code> in <a href="https://github.com/confluentinc/cp-helm-charts/blob/master/values.yaml">values.yaml</a></p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
These type of clusters are suitable for <strong>strictly</strong> development and testing  purposes.
The <code>StatefulSets+</code> are going to use <code>emptyDir</code> volumes, this means that its content strictly related to the pod life cycle and is deleted when the pod goes down.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="install-confluent-platform-charts"><a class="anchor" href="#install-confluent-platform-charts"></a>Install Confluent Platform Charts</h3>
<div class="paragraph">
<p>Clone the Confluent Helm Chart repo</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh"><span class="o">&gt;</span> helm repo add confluentinc https://confluentinc.github.io/cp-helm-charts/
<span class="s2">"confluentinc"</span> has been added to your repositories

<span class="o">&gt;</span> helm repo update
Hang tight <span class="k">while </span>we grab the latest from your chart repositories...
...Skip <span class="nb">local </span>chart repository
...Successfully got an update from the <span class="s2">"confluentinc"</span> chart repository
...Successfully got an update from the <span class="s2">"stable"</span> chart repository
Update Complete. ⎈ Happy Helming!⎈</code></pre>
</div>
</div>
<div class="paragraph">
<p>Install a 3 node Zookeeper ensemble, a Kafka cluster of 3 brokers, 1 Confluent  Schema Registry instance, 1 REST Proxy instance, and 1 Kafka Connect worker, 1 ksqlDB server in your Kubernetes environment.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Naming the chart <code>--name my-confluent-oss</code> is optional, but we assume this is the name in the remainder of the documentation.
Otherwise, helm will generate release name.
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm <span class="nb">install </span>confluentinc/cp-helm-charts <span class="nt">--name</span> my-confluent-oss</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you want to install without the Confluent Schema Registry instance, the REST Proxy instance, and the Kafka Connect worker:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm <span class="nb">install</span> <span class="nt">--set</span> cp-schema-registry.enabled<span class="o">=</span><span class="nb">false</span>,cp-kafka-rest.enabled<span class="o">=</span><span class="nb">false</span>,cp-kafka-connect.enabled<span class="o">=</span><span class="nb">false </span>confluentinc/cp-helm-charts</code></pre>
</div>
</div>
<div class="paragraph">
<p>View the installed Helm releases:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm list
NAME                REVISION    UPDATED                     STATUS      CHART                   NAMESPACE
my-confluent-oss    1           Tue Jun 12 16:56:39 2018    DEPLOYED    cp-helm-charts-0.1.0    default</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="verify-installation"><a class="anchor" href="#verify-installation"></a>Verify Installation</h3>
<div class="sect3">
<h4 id="using-helm"><a class="anchor" href="#using-helm"></a>Using Helm</h4>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<em>This step is optional</em>
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">Run the embedded test pod in each sub-chart to  verify installation</div>
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm <span class="nb">test </span>my-confluent-oss</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="verify-kafka-cluster"><a class="anchor" href="#verify-kafka-cluster"></a>Verify Kafka cluster</h4>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<em>This step is optional</em> - to verify that Kafka is working as expected, connect to one of the Kafka pods and produce some messages to a Kafka topic.
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">List your pods and wait until they are all in <code>Running</code> state.</div>
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">kubectl get pods</code></pre>
</div>
</div>
<div class="paragraph">
<div class="title">Connect to the container <code>cp-kafka-broker</code> in a Kafka broker pod to  produce messages to a Kafka topic.</div>
<p>If you specified a different release  name, substitute <code>my-confluent-oss</code> with whatever you named your  release.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">kubectl <span class="nb">exec</span> <span class="nt">-c</span> cp-kafka-broker <span class="nt">-it</span> my-confluent-oss-cp-kafka-0 <span class="nt">--</span> /bin/bash /usr/bin/kafka-console-producer <span class="nt">--broker-list</span> localhost:9092 <span class="nt">--topic</span> <span class="nb">test</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Wait for a <code>&gt;</code> prompt, and enter some text.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>m1
m2</pre>
</div>
</div>
<div class="paragraph">
<p>Press <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>C</kbd></span> to close the producer session.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Consume the messages from the same Kafka topic as above.</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre>kubectl exec -c cp-kafka-broker -it my-confluent-oss-cp-kafka-0 -- /bin/bash  /usr/bin/kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning</pre>
</div>
</div>
<div class="paragraph">
<p>You should see the messages which were published from the console producer.
Press <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>C</kbd></span> to stop consuming.</p>
</div>
</div>
<div class="sect3">
<h4 id="manual-test"><a class="anchor" href="#manual-test"></a>Manual Test</h4>
<div class="sect4">
<h5 id="zookeepers"><a class="anchor" href="#zookeepers"></a>Zookeepers</h5>
<div class="listingblock">
<div class="content">
<pre>git clone https://github.com/confluentinc/cp-helm-charts.git        <i class="conum" data-value="1"></i><b>(1)</b>
kubectl apply -f cp-helm-charts/examples/zookeeper-client.yaml      <i class="conum" data-value="2"></i><b>(2)</b>
...
kubectl exec -it zookeeper-client -- /bin/bash zookeeper-shell &lt;zookeeper service&gt;:&lt;port&gt; ls /brokers/ids       <i class="conum" data-value="3"></i><b>(3)</b>
kubectl exec -it zookeeper-client -- /bin/bash zookeeper-shell &lt;zookeeper service&gt;:&lt;port&gt; get /brokers/ids/0
kubectl exec -it zookeeper-client -- /bin/bash zookeeper-shell &lt;zookeeper service&gt;:&lt;port&gt; ls /brokers/topics    <i class="conum" data-value="4"></i><b>(4)</b></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Clone Helm Chars git repository</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Deploy a client pod.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Connect to the client pod and use the <code>zookeeper-shell</code> command to  explore brokers&#8230;&#8203;</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>topics, etc.</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="kafka"><a class="anchor" href="#kafka"></a>Kafka</h5>
<div class="listingblock">
<div class="title">Validate Kafka installation</div>
<div class="content">
<pre class="rouge highlight"><code data-lang="bash">kubectl apply <span class="nt">-f</span> cp-helm-charts/examples/kafka-client.yaml <i class="conum" data-value="1"></i><b>(1)</b>
kubectl <span class="nb">exec</span> <span class="nt">-it</span> kafka-client <span class="nt">--</span> /bin/bash      <i class="conum" data-value="2"></i><b>(2)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Deploy a Kafka client pod.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Log into the Pod</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">From within the kafka-client pod, explore with kafka commands:</div>
<div class="content">
<pre class="rouge highlight"><code data-lang="bash"><span class="c">## Setup</span>
<span class="nb">export </span><span class="nv">RELEASE_NAME</span><span class="o">=</span>&lt;release name&gt;
<span class="nb">export </span><span class="nv">ZOOKEEPERS</span><span class="o">=</span><span class="k">${</span><span class="nv">RELEASE_NAME</span><span class="k">}</span><span class="nt">-cp-zookeeper</span>:2181
<span class="nb">export </span><span class="nv">KAFKAS</span><span class="o">=</span><span class="k">${</span><span class="nv">RELEASE_NAME</span><span class="k">}</span><span class="nt">-cp-kafka-headless</span>:9092

<span class="c">## Create Topic</span>
kafka-topics <span class="nt">--zookeeper</span> <span class="nv">$ZOOKEEPERS</span> <span class="nt">--create</span> <span class="nt">--topic</span> test-rep-one <span class="nt">--partitions</span> 6 <span class="nt">--replication-factor</span> 1

<span class="c">## Producer</span>
kafka-run-class org.apache.kafka.tools.ProducerPerformance <span class="nt">--print-metrics</span> <span class="nt">--topic</span> test-rep-one <span class="nt">--num-records</span> 6000000 <span class="nt">--throughput</span> 100000 <span class="nt">--record-size</span> 100 <span class="nt">--producer-props</span> bootstrap.servers<span class="o">=</span><span class="nv">$KAFKAS</span> buffer.memory<span class="o">=</span>67108864 batch.size<span class="o">=</span>8196

<span class="c">## Consumer</span>
kafka-consumer-perf-test <span class="nt">--broker-list</span> <span class="nv">$KAFKAS</span> <span class="nt">--messages</span> 6000000 <span class="nt">--threads</span> 1 <span class="nt">--topic</span> test-rep-one <span class="nt">--print-metrics</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="run-a-streams-application"><a class="anchor" href="#run-a-streams-application"></a>Run A Streams Application</h4>
<div class="paragraph">
<p>ksqlDB is the streaming SQL engine that enables real-time data  processing against Apache Kafka.
Now that you have running in your Kubernetes cluster, you may run a <a href="https://github.com/confluentinc/cp-helm-charts/blob/master/examples/ksql-demo.yaml">ksqlDB example</a>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="operations"><a class="anchor" href="#operations"></a>Operations</h3>
<div class="sect3">
<h4 id="scaling-zookeeper"><a class="anchor" href="#scaling-zookeeper"></a>Scaling Zookeeper</h4>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
All scaling operations should be done offline with no producer or  consumer connection.
The number of nodes should always be odd number.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Install cp-helm-charts with default 3 node ensemble</p>
</div>
<div class="listingblock">
<div class="content">
<pre>helm install cp-helm-charts</pre>
</div>
</div>
<div class="paragraph">
<p>Scale nodes up to 5, change <code>servers</code> under <code>cp-zookeeper</code> to 5 in <code>values.yaml</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre>helm upgrade &lt;release name&gt; cp-helm-charts</pre>
</div>
</div>
<div class="paragraph">
<p>Scale nodes down to 3, change <code>servers</code> under <code>cp-zookeeper</code> to 3 in <code>values.yaml</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre>helm upgrade &lt;release name&gt; cp-helm-charts</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="scaling-kafka"><a class="anchor" href="#scaling-kafka"></a>Scaling Kafka</h4>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Scaling Kafka brokers without doing Partition Reassignment will cause data loss.
You must reassign partitions correctly before <a href="https://kafka.apache.org/documentation/#basic_ops_cluster_expansion">scaling the Kafka cluster</a>.
</td>
</tr>
</table>
</div>
<div class="sect4">
<h5 id="install-cp-helm-charts-with-default-3-brokers-kafka-cluster"><a class="anchor" href="#install-cp-helm-charts-with-default-3-brokers-kafka-cluster"></a>Install cp-helm-charts with default 3 brokers kafka cluster</h5>
<div class="listingblock">
<div class="content">
<pre>helm install cp-helm-charts</pre>
</div>
</div>
<div class="paragraph">
<p>Scale kafka brokers up to 5, change <code>brokers+</code> under <code>cp-kafka</code> to 5 in <code>values.yaml</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre>helm upgrade &lt;release name&gt; cp-helm-charts</pre>
</div>
</div>
<div class="paragraph">
<p>Scale kafka brokers down to 3, change <code>brokers</code> under <code>cp-kafka</code> to
3 in values.yaml</p>
</div>
<div class="listingblock">
<div class="content">
<pre>helm upgrade &lt;release name&gt; cp-helm-charts</pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="monitoring"><a class="anchor" href="#monitoring"></a>Monitoring</h4>
<div class="paragraph">
<p>JMX Metrics are enabled by default for all components, Prometheus JMX  Exporter is installed as a sidecar container along with all Pods.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Install Prometheus and Grafana in same Kubernetes cluster using helm</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="bash">helm <span class="nb">install </span>stable/prometheus
helm <span class="nb">install </span>stable/grafana</code></pre>
</div>
</div>
</li>
<li>
<p>Add Prometheus as Data Source in Grafana, url should be something  like: <code>http://illmannered-marmot-prometheus-server:9090</code></p>
</li>
<li>
<p>Import dashboard under <a href="https://github.com/confluentinc/cp-helm-charts/blob/master/grafana-dashboard/confluent-open-source-grafana-dashboard.json">grafana-dashboard</a> into Grafana <span class="image"><img src="screenshots/kafka.png" alt="Kafka Dashboard"></span>
<span class="image"><img src="screenshots/zookeeper.png" alt="ZooKeeper Dashboard"></span></p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="teardown"><a class="anchor" href="#teardown"></a>Teardown</h3>
<div class="paragraph">
<p>To remove the pods, list the pods with <code>kubectl get pods</code> and then delete the pods by name.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">kubectl get pods
kubectl delete pod &lt;podname&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>To delete the Helm release, find the Helm release name with <code>helm list</code> and delete it with <code>helm delete</code>.
You may also need to  clean up leftover <code>StatefulSets</code>, since <code>helm delete</code> can leave them  behind.
Finally, clean up all persisted volume claims (pvc) created by  this release.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">helm list
helm delete &lt;release name&gt;
kubectl delete statefulset &lt;release name&gt;-cp-kafka &lt;release name&gt;-cp-zookeeper
kubectl delete pvc <span class="nt">--selector</span><span class="o">=</span><span class="nv">release</span><span class="o">=</span>&lt;release name&gt;</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="appendix-create-a-local-kubernetes-cluster"><a class="anchor" href="#appendix-create-a-local-kubernetes-cluster"></a>Appendix: Create a Local Kubernetes Cluster</h2>
<div class="sectionbody">
<div class="paragraph">
<p>There are many deployment options to get set up with a Kubernetes  cluster, and this document provides instructions for using
<a href="https://kubernetes.io/docs/setup/minikube/">Minikube</a> to set up a local Kubernetes cluster.
Minikube runs a single-node Kubernetes cluster inside a VM on your laptop.</p>
</div>
<div class="paragraph">
<p>You may alternatively set up a Kubernetes cluster in the cloud using  other providers such as
<a href="https://cloud.google.com/kubernetes-engine/docs/quickstart">Google Kubernetes Engine (GKE)</a>.</p>
</div>
<div class="sect2">
<h3 id="create-local-minikube"><a class="anchor" href="#create-local-minikube"></a>Install Minikube and Drivers</h3>
<div class="paragraph">
<p>Minikube version 0.23.0 or higher is required for docker server <a href="https://github.com/moby/moby/pull/31352%5B17.05" class="bare">https://github.com/moby/moby/pull/31352%5B17.05</a>], which adds support for using <code>ARG</code> in <code>FROM</code> in your <code>Dockerfile</code>.</p>
</div>
<div class="paragraph">
<p>First follow the basic <a href="https://github.com/kubernetes/minikube">Minikube installation instructions</a>.</p>
</div>
<div class="paragraph">
<p>Then install the <a href="https://github.com/kubernetes/minikube/blob/master/docs/drivers.md">Minikube drivers</a>.
Minikube uses Docker Machine to manage the Kubernetes VM so it benefits from the driver plugin architecture that Docker Machine uses to provide a consistent way to manage various VM providers.
Minikube embeds VirtualBox and VMware Fusion drivers so there are no additional steps to use them.
However, other drivers require an extra binary to be present  in the host <code>PATH</code>.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
If you are running on macOS, in particular make sure to install the <code>hyperkit</code> drivers for the native OS X hypervisor:
</td>
</tr>
</table>
</div>
<div class="exampleblock">
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">brew <span class="nb">install </span>hyperkit
minikube config <span class="nb">set </span>driver hyperkit     <i class="conum" data-value="1"></i><b>(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Use hyperkit drivel by default</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="start-minikube"><a class="anchor" href="#start-minikube"></a>Start Minikube</h3>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
The following command increases the memory to 6096 MB and uses the <code>hyperkit</code> driver for the native macOS Hypervisor.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Start Minikube. The following command increases the memory to 6096 MB and uses the <code>xhyve</code> driver for the native macOS Hypervisor.</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">minikube start <span class="nt">--kubernetes-version</span> v1.9.4 <span class="nt">--cpus</span> 4 <span class="nt">--memory</span> 6096 <span class="nt">--vm-driver</span><span class="o">=</span>xhyve <span class="nt">--v</span><span class="o">=</span>8</code></pre>
</div>
</div>
</li>
<li>
<p>Continue to check status of your local Kubernetes cluster until both minikube and cluster are in Running state</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">❯ minikube status
m01
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured</code></pre>
</div>
</div>
</li>
<li>
<p>Work around Minikube
<a href="https://github.com/kubernetes/minikube/issues/1568">issue #1568</a>.</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh">minikube ssh <span class="nt">--</span> <span class="nb">sudo </span>ip <span class="nb">link set </span>docker0 promisc on</code></pre>
</div>
</div>
</li>
<li>
<p>Set the context.</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sh"><span class="nb">eval</span> <span class="k">$(</span>minikube docker-env<span class="k">)</span>

kubectl config set-context minikube.internal <span class="nt">--cluster</span><span class="o">=</span>minikube <span class="nt">--user</span><span class="o">=</span>minikube
Context <span class="s2">"minikube.internal"</span> modified.

kubectl config use-context minikube.internal
Switched to context <span class="s2">"minikube.internal"</span>.</code></pre>
</div>
</div>
</li>
</ol>
</div>
<div class="sect3">
<h4 id="verify-minikube-local-kubernetes-environment"><a class="anchor" href="#verify-minikube-local-kubernetes-environment"></a>Verify Minikube Local Kubernetes Environment</h4>
<div class="listingblock">
<div class="content">
<pre>kubectl config current-context
minikube.internal

kubectl cluster-info
Kubernetes master is running at https://192.168.99.106:8443
KubeDNS is running at https://192.168.99.106:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="thanks"><a class="anchor" href="#thanks"></a>Thanks</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Huge thanks to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://github.com/kubernetes/charts/tree/master/incubator/kafka">Kafka helm chart</a></p>
</li>
<li>
<p><a href="https://github.com/kubernetes/charts/tree/master/incubator/zookeeper">ZooKeeper helm chart</a></p>
</li>
<li>
<p><a href="https://github.com/kubernetes/charts/tree/master/incubator/schema-registry">Schema Registry helm chart</a></p>
</li>
<li>
<p><a href="https://github.com/Yolean/kubernetes-kafka">kubernetes-kafka</a></p>
</li>
<li>
<p><a href="https://github.com/solsson/dockerfiles">docker-kafka</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2020-05-11 17:42:23 -0400
</div>
</div>
<style>
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge .cm {
  color: #999988;
  font-style: italic;
}
pre.rouge .cp {
  color: #999999;
  font-weight: bold;
}
pre.rouge .c1 {
  color: #999988;
  font-style: italic;
}
pre.rouge .cs {
  color: #999999;
  font-weight: bold;
  font-style: italic;
}
pre.rouge .c, pre.rouge .cd {
  color: #999988;
  font-style: italic;
}
pre.rouge .err {
  color: #a61717;
  background-color: #e3d2d2;
}
pre.rouge .gd {
  color: #000000;
  background-color: #ffdddd;
}
pre.rouge .ge {
  color: #000000;
  font-style: italic;
}
pre.rouge .gr {
  color: #aa0000;
}
pre.rouge .gh {
  color: #999999;
}
pre.rouge .gi {
  color: #000000;
  background-color: #ddffdd;
}
pre.rouge .go {
  color: #888888;
}
pre.rouge .gp {
  color: #555555;
}
pre.rouge .gs {
  font-weight: bold;
}
pre.rouge .gu {
  color: #aaaaaa;
}
pre.rouge .gt {
  color: #aa0000;
}
pre.rouge .kc {
  color: #000000;
  font-weight: bold;
}
pre.rouge .kd {
  color: #000000;
  font-weight: bold;
}
pre.rouge .kn {
  color: #000000;
  font-weight: bold;
}
pre.rouge .kp {
  color: #000000;
  font-weight: bold;
}
pre.rouge .kr {
  color: #000000;
  font-weight: bold;
}
pre.rouge .kt {
  color: #445588;
  font-weight: bold;
}
pre.rouge .k, pre.rouge .kv {
  color: #000000;
  font-weight: bold;
}
pre.rouge .mf {
  color: #009999;
}
pre.rouge .mh {
  color: #009999;
}
pre.rouge .il {
  color: #009999;
}
pre.rouge .mi {
  color: #009999;
}
pre.rouge .mo {
  color: #009999;
}
pre.rouge .m, pre.rouge .mb, pre.rouge .mx {
  color: #009999;
}
pre.rouge .sb {
  color: #d14;
}
pre.rouge .sc {
  color: #d14;
}
pre.rouge .sd {
  color: #d14;
}
pre.rouge .s2 {
  color: #d14;
}
pre.rouge .se {
  color: #d14;
}
pre.rouge .sh {
  color: #d14;
}
pre.rouge .si {
  color: #d14;
}
pre.rouge .sx {
  color: #d14;
}
pre.rouge .sr {
  color: #009926;
}
pre.rouge .s1 {
  color: #d14;
}
pre.rouge .ss {
  color: #990073;
}
pre.rouge .s {
  color: #d14;
}
pre.rouge .na {
  color: #008080;
}
pre.rouge .bp {
  color: #999999;
}
pre.rouge .nb {
  color: #0086B3;
}
pre.rouge .nc {
  color: #445588;
  font-weight: bold;
}
pre.rouge .no {
  color: #008080;
}
pre.rouge .nd {
  color: #3c5d5d;
  font-weight: bold;
}
pre.rouge .ni {
  color: #800080;
}
pre.rouge .ne {
  color: #990000;
  font-weight: bold;
}
pre.rouge .nf {
  color: #990000;
  font-weight: bold;
}
pre.rouge .nl {
  color: #990000;
  font-weight: bold;
}
pre.rouge .nn {
  color: #555555;
}
pre.rouge .nt {
  color: #000080;
}
pre.rouge .vc {
  color: #008080;
}
pre.rouge .vg {
  color: #008080;
}
pre.rouge .vi {
  color: #008080;
}
pre.rouge .nv {
  color: #008080;
}
pre.rouge .ow {
  color: #000000;
  font-weight: bold;
}
pre.rouge .o {
  color: #000000;
  font-weight: bold;
}
pre.rouge .w {
  color: #bbbbbb;
}
pre.rouge {
  background-color: #f8f8f8;
}
</style>
</body>
</html>